/**
 * Desc：简单工厂、工厂方法、抽象工厂
 * Created by VincentZee on 2019/2/25
 */
public class FactoryPatternDemo {
    public static void main(String[] args) throws Exception {
        // 简单工厂
        /*Factory factory = new Factory();
        ICar car = factory.GetCar(CarType.JeepCarType);
        car.getCar();*/

        // 工厂方法
        IFactory iFactory = new SportFactory();
        ICar car = iFactory.createCar();
        car.getCar();
    }
}

/**
 * Desc：简单工厂,静态工厂方法(Static Factory Method)模式,由一个工厂对象决定创建出哪一种产品类的实例。但不属于23种GOF设计模式之一。
 */
interface ICar {
    void getCar();
}

enum CarType {
    SportCarType, JeepCarType, HatchbackCarType
}

/**
 * 具体产品类： 跑车
 */
class SportCar implements ICar {
    @Override
    public void getCar() {
        System.out.println("SportCar");
    }
}

/**
 * 具体产品类： 越野车
 */
class JeepCar implements ICar {
    @Override
    public void getCar() {
        System.out.println("JeepCar");
    }
}

/**
 * 具体产品类： 两厢车
 */
class HatchbackCar implements ICar {
    @Override
    public void getCar() {
        System.out.println("HatchbackCar");
    }
}

class Factory {
    public ICar GetCar(CarType carType) throws Exception {
        switch (carType) {
            case JeepCarType:
                return new JeepCar();
            case SportCarType:
                return new SportCar();
            case HatchbackCarType:
                return new HatchbackCar();
            default:
                throw new Exception("no carType！");
        }
    }
}

/**
 * Desc：工厂方法(Factory Method),又称多态性工厂模式。核心的工厂类不再负责所有的产品的创建，而是将具体创建的工作交给子类去做。
 */

interface IFactory {
    ICar createCar();
}

/**
 * 具体工厂类： 用于创建跑车类
 */
class SportFactory implements IFactory {
    @Override
    public ICar createCar() {
        return new SportCar();
    }
}

/**
 * 具体工厂类： 用于创建越野车类
 */
class JeepFactory implements IFactory {
    @Override
    public ICar createCar() {
        return null;
    }
}

/**
 * 具体工厂类： 用于创建两厢车类
 */
class HatchbackFactory implements IFactory {

    @Override
    public ICar createCar() {
        return new HatchbackCar();
    }
}